#include "StudentManage.h"


int main(){
    system("chcp 65001");
    Node *head = malloc(sizeof(Node));
    head->next = NULL;

    loadStudent(head);



    while (1)
    {
        welcome();
        char c = _getch();
        switch (c)
        {
        case '1':
        inputStudent(head);
            break;
        case '2':
        printStudent(head);
            break;
        case '3':
        countStudent(head);
            break;
        case '4':
        findStudent(head);
            break;
        case '5':
        modifyStudent(head);
            break;
        case '6':
        deleteStudent(head);
            break;
        case '7':
        sortStudent(head);
            break;
        case '8':
            system("cls");
            exit(0);
            break;
        default:
            printf("请重新输入想使用的功能\n");
            break;
        }
    }
    




    return 0;
}

void welcome(){
        printf("*********************************************************\n");
        printf("*\t学生成绩管理系统\t*\n");
        printf("*********************************************************\n");
        printf("*\t请选择功能列表\t\t*\n");
        printf("*********************************************************\n");
        printf("*\t1.录入学生信息\t\t*\n");
        printf("*\t2.打印学生信息\t\t*\n");
        printf("*\t3.统计学生人数\t\t*\n");
        printf("*\t4,査找学生信息\t\t*\n");
        printf("*\t5,修改学生信息\t\t*\n");
        printf("*\t6.删除学生信息\t\t*\n");
        printf("*\t7.按成缋排序\t\t*\n");
        printf("*\t8.退出系统\t\t*\n");
        printf("*********************************************************\n");
}


void inputStudent(Node* head){
    Node* new = malloc(sizeof(Node));
    new->next = NULL;
    printf("请输入学生的学号，姓名，成绩\n");
    scanf("%d%s%d",&new->student.stuNum,new->student.name,&new->student.score);

    Node* p = head;
    while (p->next != NULL)
    {
        p = p->next;
    }
    //将数据插入到链表尾部（尾插法）
    p->next = new;

    saveStudent(head);
    //暂停程序
    system("pause");
    //清空控制台
    system("cls");


}


void printStudent(Node* head){
    Node *p = head->next;

    while (p != NULL)
    {
        printf("学号：%d 姓名：%s 成绩：%d\n",p->student.stuNum,p->student.name,p->student.score);
        p = p->next;
    }

    //暂停程序
    system("pause");
    //清空控制台
    system("cls");
    
}


void countStudent(Node* head){
    Node *p = head->next;
    int count = 0;
    while (p != NULL)
    {
        count++;
        p = p->next;   
    }

    printf("学生总人数为：%d\n", count);
    
    system("pause");
    //清空控制台
    system("cls");
}

void findStudent(Node* head){
    printf("请输入要查找的学生的学号: ");
    int stuNum;
    scanf("%d",&stuNum);

    Node* p = head->next;

    while (p != NULL)
    {   
        if(stuNum == p->student.stuNum){
            printf("学号：%d 姓名：%s 成绩：%d\n", p->student.stuNum, p->student.name, p->student.score);
            //暂停程序
            system("pause");
            //清空控制台
            system("cls");
            return;
        }
        p = p->next;
    }

    printf("未能找到该学生信息\n");
    
    //暂停程序
    system("pause");
    //清空控制台
    system("cls");
}

void saveStudent(Node* head){
    FILE* file = fopen("./stu.info","w");
    if(file == NULL){
        printf("文件打开失败\n");
        return;
    }


    Node *p = head->next;

    while (p != NULL)
    {
        if (fwrite(&p->student, sizeof(Student), 1, file) != 1)
        {
            printf("学生信息保存失败\n");
            return;
        }

        p = p->next;
        

    }

    fclose(file);
    
}

void loadStudent(Node* head){
    FILE* file = fopen("./stu.info","r");
    if(!file){
        printf("文件中未找到信息，读取跳过\n");
        return;
    }

    Node* new = malloc(sizeof(Node));
    new->next = NULL;
    Node* p = head;

    while (fread(&new->student, sizeof(Student), 1, file) == 1){
        p->next = new;
        p = new;
        new = malloc(sizeof(Student));
        new->next = NULL;
    }

    free(new);
    fclose(file);
    printf("文件读取成功\n");

    
    


}

void modifyStudent(Node* head){
    printf("请输入要修改的学生的学号:");
    int stuNum;
    scanf("%d",&stuNum);
    Node* p = head->next;

    while (p != NULL)
    {
        if(stuNum == p->student.stuNum){
            printf("请输入学生姓名，成绩\n");
            scanf("%s%d",p->student.name,p->student.score);
            saveStudent(head);
            printf("修改学生姓名、成绩信息成功\n");

            //暂停程序
            system("pause");
            //清空控制台
            system("cls");
            return;
        }
        p = p->next;
    }

    printf("未能找到该学生信息\n");
    //暂停程序
    system("pause");
    //清空控制台
    system("cls");
    
}

void deleteStudent(Node* head){
    printf("请输入要删除的学生的学号:");
    int stuNum;
    scanf("%d",&stuNum);

    Node* p = head;

    while (p->next != NULL)
    {
        if(stuNum == p->next->student.stuNum){
            Node* tmp = p->next;
            p->next = p->next->next;
            free(tmp);
            tmp = NULL;
            saveStudent(head);
            printf("删除成功\n");


            //暂停程序
            system("pause");
            //清空控制台
            system("cls");
            return;
        }

        p = p->next;
    }

    //暂停程序
    system("pause");
    //清空控制台
    system("cls");
    
}

void sortStudent(Node* head){
    for(Node* q = head->next; q->next != NULL; q = q->next){
        for(Node* p = head->next; p->next != NULL; p = p->next){
            if(p->student.score > p->next->student.score){
                Student tmp = p->student;
                p->student = p->next->student;
                p->next->student = tmp;
            }
        }
    }

    printStudent(head);
}














